#include <iostream>

using namespace std;

// 二维数组操作
void rewrite(int **arr)
{
    for (int i = 0; i < 10; i++)
    {
        arr[i] = new int[12];
        for (int j = 0; j < 12; j++)
        {
            arr[i][j] = i * j;
        }
    }
}

int **test()
{
    int **arr = new int *[10];

    /* for (int i = 0; i < 10; i++)
    {
        arr[i] = new int[12];
        for (int j = 0; j < 12; j++)
        {
            arr[i][j] = j;
        }
    } */

    rewrite(arr);

    return arr;
}

void releaseMemory(int **arr)
{
    for (int i = 0; i < 10; i++)
    {
        delete arr[i];
    }

    delete[] arr;
}

static int testArr[][2] = {
    {2, 3},
    {4, 5}};

int (*fn())[2]
{
    return testArr;
}

int main()
{
    int **ptr = test();

    // cout << ptr << ": " << *(*(ptr + 7)) << endl;

    // cout << ptr[9][9] << endl;

    for (int i = 0; i < 10; i++)
    {
        cout << i << ": ";
        for (int j = 0; j < 12; j++)
        {
            cout << ptr[i][j] << ' ';
            // cout << *(*(ptr + 12 * i + j)) << ' ';
        }
        // cout << *(++ptr) << endl;
        cout << endl;
    }

    releaseMemory(ptr);
    /* for (int i = 0; i < 10; i++)
    {
        if (ptr[i] != NULL)
        {
            delete[] ptr[i];
            // cout << ptr[i] << endl;
        }
    }

    delete[] ptr; */

    // for (int i = 0; i < 10; i++)
    // {
    //     for (int j = 0; j < 12; j++)
    //     {
    //         // cout << ptr[i][j];
    //         cout << ptr[i * 12 + j];

    //         // cout << *(ptr);
    //         // delete[] ptr[i * 12 + j];
    //     }

    //     cout << endl;

    //     // delete[] (ptr + i * 11);
    // }

    // delete ptr;

    // 返回二维数组的指针
    int(*array)[2] = fn();

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            cout << array[i][j] << ' ';
        }
        cout << endl;
    }

    int a = 123;
    cout << "123" + to_string(a) + "321" << endl;

    return 0;
}